#ifndef __APP_SERIAL_H
#define __APP_SERIAL_H
#include <termio.h>
#include "app_device.h"
//波特率
typedef enum
{
    baud_9600 = B9600,
    baud_19200 = B19200,
    Baud_115200 = B115200
}Baud;

//数据位 需要把CSIZE 归0
typedef enum
{
  DataDits_5 = CS5,
  DataDits_6 = CS6,
  DataDits_7 = CS7,
  DataDits_8 = CS8
}DataDits;


//停止位 使用前CSTOPB清0
typedef enum
{
    StopDits_1 = 0,
    StopDits_2 = CSTOPB,
}StopDits;


//校验为  设在之前需要 PARENB这个是校验是能位  PARODD 这个为0 计校验 1欧校验 这两个为变0
typedef enum
{
    Parity_None = 0,    //无校验为
    Parity_Odd = PARENB ,    //基校验  PARENB这个是校验是能位  PARODD 这个为0 计校验 1欧校验
    Parity_Even = PARENB | PARODD,  //欧校验
} Parity;


//串口通讯设备结构体  里面有他的父类 通讯设备结构体  
//当创建对象后  串口通讯设备 和  通讯设备 指向的是同一个地方
//串口通讯设备 比 通讯设备长在通讯设备的基层上多了一些特殊的属性
typedef struct 
{
    Device super;             //一个普通的通讯设备对象
    Baud baud;                //这个串口的波特率
    DataDits data_dits;       //这个串口的数据位
    StopDits stop_dits;       //这个串口的停止位
    Parity parity;            //这个串口采用那种校验模式
}SerialDevice;


/// @brief 这是把串口设备初始化
/// @param serial_device 串口设备
/// @param filename 串口设备名字
/// @return 成功 0 失败返回 -1
int app_serial_init(SerialDevice *serial_device,char * filename);

/// @brief 设置设备的波特率
/// @param serial_device  设备
/// @param baud 波特率
/// @return 成功 0 失败返回 -1
int app_serial_setBaud(SerialDevice * serial_device,Baud baud);


/// @brief 设置设备的数据位
/// @param serial_device 设备
/// @param data_dits 数据位数
/// @return 成功 0 失败返回 -1
int app_serial_setDataDits(SerialDevice * serial_device,DataDits data_dits);


/// @brief 设置数据的停止位
/// @param serial_device  设备
/// @param syop_dits 停止位
/// @return 成功 0 失败返回 -1
int app_serial_setStopDits(SerialDevice * serial_device,StopDits syop_dits);


/// @brief 设置设备的较言位
/// @param serial_device 设备
/// @param parity 校验位
/// @return 成功 0 失败返回 -1
int app_serial_setParity(SerialDevice * serial_device,Parity paritys);


/// @brief 设置在读串口设备的rx（就算32里面那个别人给你发送数据然后数据到那个buffer（这个buffer三系统定的不是我们定的那个缓冲区））的数据的模式
/// @param serial_device 设备
/// @param number 当位1是阻塞模式至少读到一个数据   位0  没有数据200ms返回
/// @return 成功 0 失败返回 -1
int app_serial_setBlockMote(SerialDevice * serial_device,int number);

/// @brief 这个是把串口从另一个串口接受到数据 用纯二进制保存在他的buffer（这个buffer三系统定的不是我们定的那个缓冲区，
/// 不会经国任何处理
/// @param serial_device  设备
/// @return 成功 0 失败返回 -1
int app_serial_setRawMode(SerialDevice *serial_device);


/// @brief 在设在任何属性 比如波特率。。。 都需要刷新一下才会生效  init初始化这个函数不用 内部已经执行
/// @param device 
/// @return 成功 0 失败返回 -1
int app_serial_flush(SerialDevice *device);

#endif
